feat(api): Add blkio cgroup tuning via --blkio flag#1595
Conversation
2921cd9 to
8265a51
Compare
…imeData Addresses jglogan review feedback on PR apple#1595: 1. Move `blockIO` field out of the cross-platform `ContainerConfiguration.Resources` and into the Linux-specific `LinuxRuntimeData`. The CLI now encodes `LinuxRuntimeData(blockIO: …)` into the opaque `RuntimeConfiguration.runtimeData` field, and the Linux runtime decodes it inside `configureContainer` before applying the OCI `LinuxBlockIO` to `czConfig.blockIO`. Keeps OS-specific options out of the generic container config type. 2. Move the `--blkio` flag from `Flags.Resource` to `Flags.Management` and simplify its help to a single line pointing at the command reference, in the spirit of the existing generic options pattern. The structured key=value parsing/validation in `Parser.blockIO` is unchanged. 3. `Parser.resources` no longer takes `blkio`; `Parser.blockIO` stays public and is now invoked by `ContainerRun` / `ContainerCreate` directly. Tests rewritten to exercise `Parser.blockIO` directly. `swift build` clean; `swift test --filter ParserTest` 105 tests pass, `RuntimeConfiguration` tests pass, `container run --help` shows `--blkio` under MANAGEMENT OPTIONS. Deferred (per PR body): Package.swift / Package.resolved still pin containerization to apple/containerization#739's branch because that upstream PR is still open. Those will revert to apple/containerization at merge time, once apple#739 lands.
|
Pushed 1.
|
There was a problem hiding this comment.
Thanks for reworking things to make the data specific to the Linux runtime type.
One last pair of changes and AFAICT it looks fine, and then we should be able to proceed once @dcantah weighs in on the containerization change. See the comment regarding the CLI help, and update the command reference document with a really brief discussion of the option, and mention that the CLI option is experimental and may change in the future.
Two changes addressing review feedback from apple/containerization#739 and apple#1512 (comment): 1. Adopt the new `Containerization.LinuxBlockIO` wrapper added in containerization PR apple#739 (pin advanced to 3d009df). The wire format in `ContainerConfiguration.Resources.blockIO` stays as the Codable `ContainerizationOCI.LinuxBlockIO`; `RuntimeService.configureContainer` converts to the wrapper at the boundary via the new `toContainerizationBlockIO` helper. 2. Replace the six separate `--blkio-*` / `--device-*` flags with a single repeatable `--blkio` flag using key=value[,key=value] syntax, per apple#1512 (comment): --blkio weight=500 --blkio device=/dev/sda,weight=700,leaf-weight=300 --blkio device=/dev/sda,read-bps=1048576,write-bps=1048576 --blkio device=/dev/sda,read-iops=1000,write-iops=1000 Device values accept either an absolute host path (resolved via stat(2)) or a literal `<major>:<minor>`. Parser rejects unknown keys, conflicting global weights, and global-only keys appearing on device-less specs. Tests cover the combined spec, major:minor literal, invalid-weight, unknown-key, and global-only-on-device-spec error paths.
…imeData Addresses jglogan review feedback on PR apple#1595: 1. Move `blockIO` field out of the cross-platform `ContainerConfiguration.Resources` and into the Linux-specific `LinuxRuntimeData`. The CLI now encodes `LinuxRuntimeData(blockIO: …)` into the opaque `RuntimeConfiguration.runtimeData` field, and the Linux runtime decodes it inside `configureContainer` before applying the OCI `LinuxBlockIO` to `czConfig.blockIO`. Keeps OS-specific options out of the generic container config type. 2. Move the `--blkio` flag from `Flags.Resource` to `Flags.Management` and simplify its help to a single line pointing at the command reference, in the spirit of the existing generic options pattern. The structured key=value parsing/validation in `Parser.blockIO` is unchanged. 3. `Parser.resources` no longer takes `blkio`; `Parser.blockIO` stays public and is now invoked by `ContainerRun` / `ContainerCreate` directly. Tests rewritten to exercise `Parser.blockIO` directly. `swift build` clean; `swift test --filter ParserTest` 105 tests pass, `RuntimeConfiguration` tests pass, `container run --help` shows `--blkio` under MANAGEMENT OPTIONS. Deferred (per PR body): Package.swift / Package.resolved still pin containerization to apple/containerization#739's branch because that upstream PR is still open. Those will revert to apple/containerization at merge time, once apple#739 lands.
The branch pin to full-chaos/containerization@feat/chaos-1380-blkio-runtime was a temporary measure while apple/containerization#739 was in flight. Revert to the upstream pin so this PR can be merged independently of apple#739. Note: the runtime plumbing in RuntimeService.swift still references Containerization.LinuxBlockIO and czConfig.blockIO, which only exist on the apple#739 branch. The build will be temporarily broken until apple#739 lands upstream and the pin is bumped to whatever release contains it.
Co-authored-by: J Logan <sgtbakerrahulnet@yahoo.com>
9bc6f25 to
9736b24
Compare
Type of Change
Motivation and Context
Closes #1512.
Use case
Docker Compose exposes block-I/O tuning through
service.blkio_config(weights, weight-per-device, and read/write bps/iops throttles). Compose
translators such as container-compose can parse the field today, but they
must warn-skip it on
apple/containerbecause there is no runtime flagsurface for it —
blkio_config:silently degrades into an unconfiguredcontainer. This PR adds the missing surface so:
service.blkio_configstraight through tocontainer run/container createwithout dropping fields.build steps, log shippers sharing a host disk) can apply BFQ-style
weights and per-device throttles directly from the CLI, matching the
docker run --blkio-weight*/--device-{read,write}-{bps,iops}ergonomics they already know.
blockIOconfig flows through the runtime data path so afuture
podman-style translator or higher-level orchestrator gets thesame plumbing for free.
CLI shape
Per the grouped, repeatable
key=valueform proposed in#1512 (comment) (lives under
MANAGEMENT OPTIONS, notRESOURCE OPTIONS, to keep the resource help wall short):device=accepts an absolute host path (resolved viastat(2)formajor/minor) or a literal
<major>:<minor>. Per-device keys:weight,leaf-weight,read-bps,write-bps,read-iops,write-iops. Globalkeys (no
device=):weight,leaf-weight. The parser rejects unknownkeys, conflicting global weights, and global-only keys mixed onto
device-less specs.
Runtime plumbing
To keep OS-specific options out of the cross-platform container config,
blockIOis carried as opaque runtime data, not onContainerConfiguration.Resources:ContainerRun/ContainerCreate) callsParser.blockIO(specs:),wraps the result in
LinuxRuntimeData(blockIO:), JSON-encodes it, andpasses it as
runtimeDatatoContainerClient.create.RuntimeService.bootstrapreadsRuntimeConfiguration.runtimeDatafrom disk and threads it into
configureContainer, which decodesLinuxRuntimeDataand appliesczConfig.blockIO(aContainerization.LinuxBlockIO, theSendablewrapper around the OCItype).
Dependency
Depends on apple/containerization#739, which introduces
Containerization.LinuxBlockIOand wires it intoLinuxContainer.Configuration. While #739 is unmerged this branch pinscontainerizationto its branch(
full-chaos/containerization@feat/chaos-1380-blkio-runtime,revision
3d009df). Before merge, the pin moves back toapple/containerizationat whatever revision lands #739.Testing
swift buildclean,swift test --filter ParserTestpasses(105 tests, 5 new) — tests call
Parser.blockIOdirectly now that thefield is no longer on
Resources:testResourcesBlockIOFlags— combined global + per-device + throttletestResourcesBlockIOAcceptsMajorMinorLiteral—device=8:0literaltestResourcesRejectsInvalidBlockIOWeight— weight outside 10..1000testResourcesRejectsUnknownBlockIOKey— typo detectiontestResourcesRejectsGlobalKeyOnDeviceSpec—read-bpswithoutdevice=RuntimeConfigurationTestspass (runtime-data round-trip).container run --helpconfirmed renders the new--blkioflag underMANAGEMENT OPTIONS.